package com.chrray.position.service.position.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chrray.position.exception.ServiceException;
import com.chrray.position.mapper.position.FdAboutUsMapper;
import com.chrray.position.service.position.FdAboutUsService;
import lombok.AllArgsConstructor;
import com.chrray.position.domain.FdAboutUs;
import com.chrray.position.domain.vo.FdAboutUsVO;
import com.chrray.position.domain.dto.search.FdAboutUsSearch;
import com.chrray.position.domain.dto.FdAboutUsDTO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.BeanUtils;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 关于我们 接口实现类
 *
 * @author wusiwee
 * @email wusiwee@163.com
 * @since 1.0.1 2024-08-07
 */
@Service
@AllArgsConstructor
public class FdAboutUsServiceImpl extends ServiceImpl<FdAboutUsMapper, FdAboutUs> implements FdAboutUsService {

    /**
     * 分页查询
     * @param param 查询条件
     * @return 分页列表
     */
    @Override
    public IPage<FdAboutUsVO> pageList(FdAboutUsSearch param) {
        //查询数据
        IPage<FdAboutUs> page = page(getPage(param), getWrapper(param));
        IPage<FdAboutUsVO> voPage = new Page<>();
        //数据组装
        voPage.setRecords(page.getRecords().stream().map(r->{
            FdAboutUsVO vo = new FdAboutUsVO();
            BeanUtils.copyProperties(r,vo);
            //数据组装
            setViewParam(r,vo);
            return vo;
        }).collect(Collectors.toList()));
        voPage.setPages(page.getPages());
        voPage.setTotal(page.getTotal());
        voPage.setSize(page.getSize());
        voPage.setCurrent(page.getCurrent());
        return voPage;
    }

    /**
     * 动态条件构建
     * @param param 查询参数
     * @return 条件语句
     */
    private LambdaQueryWrapper<FdAboutUs> getWrapper(FdAboutUsSearch param){
        LambdaQueryWrapper<FdAboutUs> wrapper = Wrappers.lambdaQuery();
        // 描述
        wrapper.eq(param.getDescription() != null && !param.getDescription().isEmpty(), FdAboutUs::getDescription, param.getDescription());
        // 图片
        wrapper.eq(param.getImage() != null && !param.getImage().isEmpty(), FdAboutUs::getImage, param.getImage());
        //
        wrapper.eq(param.getDelFlag() != null, FdAboutUs::getDelFlag, param.getDelFlag());
        // 主键倒序
        wrapper.orderByDesc(FdAboutUs::getId);
        return wrapper;
    }

    /**
     * 详情
     * @param id 查询条件
     * @return 详情
    */
    @Override
    public FdAboutUsVO info(Long id) {
        // 查询主键详情
        FdAboutUs entity = getById(id);
        if (ObjectUtils.isEmpty(entity)){
            throw new ServiceException("查询不到数据");
        }
        // 回显参数封装
        FdAboutUsVO result = new FdAboutUsVO();
        BeanUtils.copyProperties(entity,result);
        // 数据组装
        setViewParam(entity,result);
        return result;
    }

    /**
     * 新增
     * @param body 参数
     * @return 成功与否
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean saveOrUpdate(FdAboutUsDTO body) {
        if (body.getId() == null){
            // 主键为空
            FdAboutUs entity = new FdAboutUs();
            BeanUtils.copyProperties(body,entity);
            // 新增
            return save(entity);
        }else {
            // 主键不为空
            FdAboutUs entity = getById(body.getId());
            BeanUtils.copyProperties(body,entity);
            // 更新
            return updateById(entity);
        }
    }

    /**
     * 批量删除
     * @param idList 主键列表
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean delete(List<Long> idList) {
        //逻辑删除
        //FdAboutUs entity = new FdAboutUs();
        //entity.setDelFlag(1);
        //return update(entity,new LambdaQueryWrapper<FdAboutUs>().in(FdAboutUs::getId,idList));

        //物理删除
        return removeByIds(idList);
    }

    /**
     * 获取分页对象
     *
     * @param param 分页参数
     */
    protected IPage<FdAboutUs> getPage(FdAboutUsSearch param) {
        return new Page<>(param.getPageNum(), param.getPageSize());
    }

    /**
     * 视图数据赋值
     * @param r 数据
     * @param vo 视图
     */
    private void setViewParam(FdAboutUs r, FdAboutUsVO vo) {
        //数据赋值业务..
    }

}
